package com.piper.spring.aop;

import java.lang.reflect.Method;

/**
 * aop配置类
 * 继承此类 用以获得 切面能力
 */
public abstract class AopConfig implements Comparable {

    /**
     * 默认为0 数值越大 切面优先级越高
     *
     * @return
     */
    public abstract int order();

    /**
     * 切点表达式规则：
     * 三部分由空格分开的字符串组成
     * 第一段表示包名  会寻找包下面继承当前类的类 todo 做循环包下面的包
     * 第二段表示类名 可以为*（全部），*abc（以abc结尾的类），abc*（以abc开头的类）
     * 第三段表示方法名
     * 每段只能有一个*号
     */
    public abstract String pointCut();

    /**
     * 重写此方法 用以执行 前置逻辑
     *
     * @param o       代理类
     * @param m       方法
     * @param objects 参数
     */
    public abstract void before(Object o, Method m, Object[] objects);

    /**
     * 重写此方法 用以执行 后置逻辑
     *
     * @param o       代理类
     * @param m       方法
     * @param objects 参数
     */
    public abstract void after(Object o, Method m, Object[] objects);

    @Override
    public int compareTo(Object o) {
        if (!(o instanceof AopConfig)) return 0;
        AopConfig ac = (AopConfig) o;
        return this.order() > ac.order() ? -1 : 1;
    }

}
